#include<iostream>
using namespace std;
#include<unistd.h>
#include<sys/types.h>
#include<errno.h>
#include<string.h>
#include<sys/wait.h>

int addtotarget(int begin,int end){
    int sum = 0;
    for(int i = begin;i <= end;i++){
        sum += i;
    }
    exit(21);
}

#define NUM 10
typedef void (*func_t)();//函数指针

func_t handlerTask[NUM];//函数指针数组

void task1(){
    printf("handler task1\n");
}
void task2(){
    printf("handler task2\n");
}
void task3(){
    printf("handler task3\n");
}
void loadTask(){
    memset(handlerTask,0,sizeof(handlerTask));
    handlerTask[0] = task1;
    handlerTask[1] = task2;
    handlerTask[2] = task3;
}


int main(){
    loadTask();
    //非阻塞式轮询等待
    pid_t id = fork();
    if(id == 0){
        int cnt = 0;
        while(1){
            printf("i am child process:%d,cnt：%d\n",getpid(),cnt);
            cnt++;
            if(cnt == 5) exit(3);
            sleep(1);
        }
    }

    //父亲进程
    int status = 0;
    while(1){
        pid_t ret = waitpid(id,&status,WNOHANG);
        if(ret == 0){
            //waitpid调用成功，但是子进程没有退出
            //todo
            printf("wait done,but child is running.....\n");
            for(int i = 0;handlerTask[i];i++){
                handlerTask[i]();//回调函数
                sleep(1);
            }
        }else if(ret > 0){
            //等待成功
            //子进程退出了
            printf("wait success,exit code:%d,sig number:%d\n",(status>>8)&0xff,(status&0x7f));
            break;
        }else{
            printf("waitpid call failed\n");
            break;
        }

    }
    sleep(2);







    // //进程等待(wait/waitpid)
    // pid_t id = fork();
    // if(id == 0){
    //     int cnt = 10;
    //     while(cnt--){
    //         printf("i am child process pid:%d,ppid:%d,cnt:%d\n",getpid(),getppid(),cnt);
    //         sleep(1);
    //     }
    //     exit(21);//子进程退出后需要进行进程等待
    // }

    // //父亲进程
    // sleep(15);
    // int status;
    // //pid_t ret = wait(nullptr);
    // pid_t ret = waitpid(id,&status,0);
    // if(ret == id){
    //     printf("wait success:%d,sig number:%d,child exit code:%d\n",ret,(status & 0x7f),(status >> 8 )&0xff);
    // }else{
    //     printf("wait fail\n");
    // }
    // sleep(3);




    // printf("hello world\n");
    // int ret = addtotarget(0,100);
    // printf("sum = %d\n",ret);
    
    // while(1){
    //     sleep(1);
    // }




    // //打印出所有退出码的含义
    // for(int i = 0;i<200;i++){
    //     printf("%d:%s\n",i,strerror(i));
    // }



    // //测试echo $?->返回最近一个进程再命令行中执行结束后返回的对应的退出码
    // int num = addtotarget(1,100);
    // if(num == 5050){
    //     return 0;
    // }else{
    //     return 1;
    // }


    return 0;
}